home *** CD-ROM | disk | FTP | other *** search
/ Inside Mac Games Volume 5 #3 / IMG 46 Vol 5-3.iso / More Goodies / More For Your Game / Dark Forces / Documentation ƒ / DF Editors' Guide / DF Specs < prev    next >
Text File  |  1996-07-09  |  34KB  |  818 lines

  1.  
  2. [Please use COURRIER-10 to view this file]
  3.  
  4.  
  5. ************************
  6. DARK FORCES SPECS v 1.00
  7. ************************
  8.  
  9. Author
  10. Yves BORCKMANS (find e-mail)
  11. (Please state the package version when you email me)
  12.  
  13. Credits
  14. ---> Serge DEBROEYER
  15. for adjoin/mirror tips, some flags, some INF tips, complex sectors errors, ...
  16. ---> Don SIELKE (DSielke@aol.com)
  17. for the complete flags list, the -u option, ...
  18. ---> Florian ENGELHARDT (100442.2012@compuserve.com)
  19. for information on GMD files
  20.  
  21. Dark Forces is (c) LucasArts Entertainment Company
  22.  
  23. LucasArts has absolutely nothing to do with these totally unofficial specs,
  24. and shouldn't be bothered with them in any way!
  25.  
  26.  
  27. Welcome to the "DARK FORCES SPECS" !
  28. As you will rapidly see, there are still a lot of unknown things in these specs. But as they are diminishing very quickly, I found it was time to write them down in a "formal" way, which can serve as a reference.
  29. As always, nothing is as good as seeing how professionnals do it, so don't hesitate to go and see how the LucasArt team did it.
  30. I will also try to explain differences with DOOM level making where applicable, so if you have experience in that domain, look for the DOOM markings.
  31.  
  32. Note : I will frequently use the following abbreviations
  33. -DF =Dark Forces
  34. -LEC=LucasArts Entertainment Company
  35. -SC =sector
  36. -WL =wall
  37. -VX =vertice
  38. -OB =object
  39. -TX =texture
  40. Changes since previous release have been marked [NEW].
  41.  
  42. *****************
  43. TABLE of CONTENTS
  44. *****************
  45. 0-GENERAL DESCRIPTION
  46. 1-GOB FILES
  47. 2-LEV FILES
  48.   2.1-Basics
  49.   2.2-File Description
  50. 3-FLAGS
  51.   3.1-Sector Flags
  52.   3.2-Wall Flags
  53. 4-INF FILES
  54. 5-GOL FILES
  55. 6-O FILES
  56.   6.1-Basics
  57.   6.2-File Description
  58. 7-PAL FILES
  59. 8-CMP FILES
  60. 9-BM FILES
  61. 10-FME FILES
  62. 11-WAX FILES
  63. 12-3DO FILES
  64. 13-VOC FILES
  65. 14-GMD FILES [NEW]
  66. 15-MSG FILES
  67. 16-CHEAT CODES
  68.  
  69.  
  70. **********************
  71. 0. GENERAL DESCRIPTION
  72. **********************
  73. Dark Forces contains a huge amount of files, and these are grouped by type in what are called GOB files. They serve as containers for other files which in turn contain information. These files can be extracted from the GOB and worked upon, then be used in the game.
  74. LEC made a very good job at this:
  75. 1. if you place a file in your game directory, DF will take it there before looking for it in its GOB.
  76. 2. if you launch DF with the -u option, it will look into the specified .gob
  77. (dark -umylevel.gob). This is probably the best method to distribute levels.
  78. A very important file "JEDI.LVL" contains the names of all the levels in the game. Sadly, editing it doesn't work further than the briefing because the level names are hardcoded in dfbrief.lfd.
  79. What you CAN do however is change the levels titles there.
  80. The levels themselves are each one composed of 6 files, found in dark.gob .
  81. - name.LEV: geometry (static)
  82. - name.INF: workings (dynamic)
  83. - name.GOL: goals
  84. - name.O  : objects
  85. - name.PAL: palette
  86. - name.CMP: palette mappings
  87. Textures are stored in .BM  files, as are the weapons display, and so on. Sounds   are stored in .VOC files (normal Creative Labs format).
  88. Objects  are stored in the following files depending on their type :
  89.  - obj.3DO: 3D object (real 3D)
  90.  - obj.FME: FRAME     (a "one view" object)
  91.  - obj.WAX: SPRITE    (ie all the ennemies)
  92.  - obj.VOC: SOUND     (any sound)
  93. There are many other inexplored files, including but not limited to :
  94.  - briefings
  95.  - cutscenes
  96.  - fonts
  97.  - vues (in level animations : ie your vessel landing)
  98. The following text will now become "quite technical" ...
  99.  
  100.  
  101. ***********
  102. 1-GOB FILES
  103. ***********
  104. GOB files are a repository for many other files. They contain a header with a signature, a data part and an index part.
  105. Their structure follows:
  106.  
  107. 0000   GOB_MAGIC   char[4]  is 'GOB' followed by 0x0A
  108. 0004   +-MASTERX   long offset to MASTERN
  109.        MASTERX+4   is the offset of FILE1 data
  110. 0008   FILE1       bytes   data for FILE1
  111. xxxx   FILE2       bytes   data for FILE2
  112. ................................
  113. ................................
  114. xxxx   FILEn       bytes     data for FILEn
  115. yy     +>MASTERN   long number of files in the GOB
  116. yy+4   INDEX1      GOB_INDEX  index to FILE1
  117. yy+25  INDEX2      GOB_INDEX  index to FILE2
  118. ................................
  119. ................................
  120. zzzz    INDEXn       GOB_INDEX  index to FILEn
  121.  
  122. The GOB_INDEX format is:
  123. 0000  IX    long offset of the start of the file
  124. 0003  LEN   long lenght of the file
  125. 0007  NAME  char[13] name of the file
  126.  
  127. UNKNOWNS  : NONE
  128.  
  129.  
  130. ***********
  131. 2-LEV FILES
  132. ***********
  133. LEV files contain a complete level geometry. They are in a very understandable but quite complex text format. They are also huge (generally > 600K).
  134. This isn't a problem, as you really cannot edit them as a text file, because of the many dependencies between the geometry elements.
  135. ----------
  136. 2.1-BASICS
  137. ----------
  138.     Geometry elements are:
  139. -VERTICE: a point in a 2 dimension projection (X and Z)
  140. -WALLS:   a line joining 2 vertices
  141. -SECTOR:  any area such as a room, door, window, etc.
  142. As the game works with a two dimension projection, the third (Y) dimension is coded at the sector level by a floor altitude and a ceiling altitude. Note that this imply that floors and ceilings are always FLAT. Sectors can however be layered on top of one another to give a "full 3D" feeling.
  143. Each sector is coded with its walls and vertices, and is completely self contained.
  144. The relation between sectors is done at the wall level by the adjoin/mirror/walk mechanism.
  145. 1--------2      Sector 1 has 5 vertices (0 to 4) marked 0 1 2 A B
  146. |        |                   5 walls    including AB (wall 3)
  147. |   S1   |
  148. |        |      Sector 2 has 4 vertices (0 to 3) marked 0 1 B A
  149. 0---B====A                   4 walls    including BA (wall 2)
  150.     | S2 |
  151.     1----0
  152.  
  153. It is VERY important to note that there are 2 vertices at point A, two vertices at point B and 2 walls marked ====. As I said above, sectors are self contained.
  154. So, to come back to the adjoin/mirror/walk mechanism, if S1 and S2 must be connected, an adjoin/mirror relation must be established.
  155. +----1---+
  156. |        |
  157. 0        2
  158. | 4    3 |
  159. +---+====+
  160.     1  2 3
  161.     +--0-+
  162. This is quite simple : the adjoin is the number of the connected sector, and the mirror is the number of the connexion wall.
  163. So we would need to set
  164.   - in S1 : W3.adjoin = S2 and W3.mirror = 2    AND
  165.   - in S2 : W2.adjoin = S1 and W2.mirror = 3
  166. For the walk values, we would need to set
  167.   - in S1 : W3.walk = S2
  168.   - in S2 : W2.walk = S1
  169. Just to be complete, if there is no adjoin/mirror/walk, the value is -1.
  170.  
  171.    Correction to this: I'm not sure that a BSP is done at all !
  172. There certainly are checks at level loading time, but a few tests on complicated sectors seem to show 'errors' in texturing or HOM problems. In fact, it seems that big non-convex sectors are problematic.
  173. Maybe you just have to try and create a few 'more convex' sectors instead. If you want to create a BSP for LEV files, don't forget you cannot split elevators nor change the walls numbers (triggers), so good luck !
  174.   More on this later.
  175.   A quick note on MID, TOP and BOT textures:
  176.   When you have adjacent sectors:
  177.   TOP is ABOVE the ceiling of the other SC
  178.   BOT is BELOW the floor of the other SC
  179.   MID is everywhere you can see through to the other SC
  180. Of course, the MID texture is not shown when walls are adjoined, so that you can see through! (Note: WL flag 3, bit 1 forces it back in place)
  181. This is exactly the same as DOOM texturing, just note that there are two different walls, not one linedef with two sidedefs.
  182. --------------------
  183. 2.2-FILE DESCRIPTION
  184. --------------------
  185. The LEV file is composed of 4 parts :
  186. -magic and version number
  187. - general level info
  188. - texture table
  189. - geometry description ie sectors, walls, vertices data
  190.  
  191. The following comments are accepted:
  192.   # comment
  193.   DATA # comment
  194. ------------------------------
  195. 2.2.1-Magic and version number
  196. ------------------------------
  197. (this is trivial)
  198. LEV 2.1
  199. ------------------------
  200. 2.2.2-General Level Info
  201. ------------------------
  202. (this part contains the following data-sample from secbase.lev)
  203. LEVELNAME SECBASE
  204. PALETTE SECBASE.PAL
  205. MUSIC AVENGE.GMD
  206. PARALLAX 1024.00 1024.00
  207. After a little testing, it seems that LEVELNAME, PALETTE and MUSIC aren't used at all by DF. (I even cannot find AVENGE.GMD !)
  208. [NEW]
  209. PARALLAX determines how much the "exterior" backgrounds scroll as you turn. 1024 1024 means as you turn around 360 degrees, you will see
  210. 1024 pixel columns of background sky. Vertical PARALLAX is similar, although of course you can't pitch 360 degrees in DF.
  211. -------------------
  212. 2.2.3-Texture Table
  213. -------------------
  214. As there is a lot of TX information in a level, a texture table is created to avoid storing TX names in full at each occurrence.
  215. (coding example)
  216.  
  217. TEXTURES 85 # number of textures
  218. TEXTURE: TEX00.BM # texture 0
  219. TEXTURE: TEX01.BM # texture 1
  220. ...............
  221. ...............
  222. TEXTURE: TEX84.BM # texture 84
  223.  
  224. Afterwards, all the TXs are refered to by their 0 based index in this texture table.
  225. --------------------------
  226. 2.2.4-Geometry description
  227. --------------------------
  228. The first data is the total number of sectors in the level:
  229. NUMSECTORS number_of_sectors
  230. Then each sector is described, with its vertices and walls.
  231. Please note that the wall data is on ONE line, but has been splitted here for visual convenience.
  232. SECTOR scnum
  233. NAME    sector_name
  234. AMBIENT 20
  235. FLOOR TEXTURE 80 -0.38 -0.06 2
  236. FLOOR ALTITUDE 0.00
  237. CEILING TEXTURE 0 0.00 0.00 2
  238. CEILING ALTITUDE -12.00
  239. SECOND ALTITUDE 0.00
  240. FLAGS 0 0 0
  241. LAYER 1
  242. VERTICES vxnum
  243. X: 252.00 Z: 224.00 # a vx
  244. ...............
  245. ...............
  246. WALLS wlnum
  247. WALL LEFT: 0 RIGHT:  1 
  248. MID:   0 0.00  0.00 0
  249. TOP:   1 0.00  0.00 0
  250. BOT:   2 0.17  0.00 0
  251. SIGN: -1 0.00  0.00
  252. ADJOIN: 57 MIRROR: 0 WALK: 57
  253. FLAGS: 0 0 0
  254. LIGHT: 5
  255. ...............
  256. ...............
  257. Hmmm... heavy information!
  258. Let's take it line by line, it's not too difficult.
  259. SECTOR scnum
  260. This is the sector number, it is zero based.
  261. NAME                sector_name
  262. This is both a link to the .INF file and a useful reminder.
  263. AMBIENT            20
  264.  
  265.     Ambient light level in this sector.
  266. |     FLOOR TEXTURE    80 -0.38 -0.06 2
  267. The TX to apply to the floor of the SC as an index in the TX table. The following two floats are the X and Z offsets by which the TX must be moved before being mapped.
  268.     The third (int) value is unknown.
  269. It seems that floor textures must be 64x64, or the game engine does
  270.     strange things.
  271. |     FLOOR ALTITUDE    0.00
  272. The altitude of the floor of this SC. Note that the Y axis goes "down",
  273.     so higher altitudes have lower values.
  274. |     CEILING TEXTURE  0  0.00  0.00 2
  275. |     CEILING ALTITUDE -12.00
  276.     Same as floor.
  277. |     SECOND ALTITUDE   0.00
  278.     This is used to indicate a second "floor" altitude in a sector.
  279. For instance, a second altitude of 4 will make you "enter into the floor"
  280. 4 deep. It will in addition make the sector waterlike and generate a
  281.     splashing sound.
  282. If you set a negative second altitude, you will be able to walk higher on
  283. the sector, provided you also enter the sector higher. This is the way
  284. platforms are created (the platform object is only a visual clue).
  285. |     FLAGS            0 0 0
  286.  
  287. Three flags, the second of which is never used in the 14 original levels.
  288.     Change various things in the sector. - Described below.
  289. |     LAYER            1
  290.     The layer on which the SC is (positive, 0 or negative).
  291. This value is used in the game to make different maps corresponding to
  292.     zones of altitude.
  293.     Note that this is only a logical grouping.
  294. |    VERTICES vxnum
  295.     This is the number of vertices that this SC has.
  296. |     X: 252.00 Z: 224.00 # a vx
  297.     List of the VXs. X and Z are trivial.
  298. |    WALLS wlnum
  299.     This is the number of walls that this SC has.
  300. \     WALL LEFT:  0 RIGHT:  1
  301.     These are the origin and destination vertices for this wall.
  302. \          MID:   0  0.00  0.00 0
  303. The TX to apply to the middle of the WL as an index in the TX table. The following two floats are the X and Y offsets by which the TX must
  304.  
  305.     be moved before being mapped (remember Y goes down).
  306.     The third (int) value is unknown.
  307. \        TOP:   1  0.00  0.00 0
  308. The TX to apply to the top of the WL as an index in the TX table.
  309. The following two floats are the X and Y offsets by which the TX must
  310.     be moved before being mapped (remember Y goes down).
  311.     The third (int) value is unknown.
  312. \        BOT:   2  0.17  0.00 0
  313. The TX to apply to the bottom of the WL as an index in the TX table. The following two floats are the X and Y offsets by which the TX must be moved before being mapped (remember Y goes down).
  314.     The third (int) value is unknown.
  315. \        SIGN: -1  0.00  0.00
  316. A sign is a second TX on the same WL, its main use is to place switches. First is the TX to apply to a sign on the WL as an index in the TX table. The following two floats are the X and Y offsets by which the TX must 
  317. be moved before being mapped (remember Y goes down). Also note that this is relative to the texturing of the wall. So if you offset the WALL, you have to add this offset to that of the SIGN.
  318. \        ADJOIN: 57 MIRROR: 0 WALK: 57
  319.     See the BASICS section.
  320. \        FLAGS: 0 0 0
  321.     Three flags.
  322.  
  323.         Change various things in the wall. - Described below.
  324.     \         LIGHT: 5
  325. Relative modification of the luminosity on this specific WL.
  326. So this is it for the LEV files. As you can see, it is totally impossible to edit as text, except perhaps to change a TX name in the TX table, which is an ultra fast way to relook a level !
  327. UNKNOWNS  : PARALLAX
  328.             the int value after textures offsets
  329.  
  330.  
  331. *******
  332. 3-FLAGS
  333. *******
  334. These are the currently known values for the various sector and wall flags.
  335. 3.1-SECTOR FLAGS
  336.     ------------
  337.     * FLAG 1
  338.     +-----------------------------------+
  339.     |        1 EXTERIOR - NO CEIL.  (SKY) |
  340.     |        2 DOOR    | instant door
  341.     |        4 SHOT REFLEXION / MAG.SEAL  | walls reflect weapon shots
  342.     |        8 EXTERIOR ADJOIN    | for adjacent skys with != alt.
  343.     |     16 ICE FLOOR        (SKATING) |
  344.     |     32 SNOW FLOOR    |
  345.  
  346.     |            64 EXPLODING WALL/DOOR    | instant exploding door
  347.     |        128 EXTERIOR - NO FLOOR  (PIT) |
  348.     |        256 EXTERIOR FLOOR ADJOIN    | for adjacent pits with != alt.
  349.     |        512 CRUSHING SECTOR    |
  350.     |    1024 NO WALL DRAW / "HORIZON"    | horizon moves with eye level
  351.     |    2048 LOW  DAMAGE    |
  352.     |    4096 HIGH DAMAGE   (both = GAS) | both can be combined for GAS
  353.     |    8192 NO SMART OBJECT REACTION    |
  354.     |  16384 SMART OBJECT REACTION    |
  355.     |  32768 SUBSECTOR    | player won't follow moving SC
  356.     |  65536 SAFE SECTOR    |
  357. | 131072 RENDERED     (do not use!) | | 262144 PLAYER       (do not use!) | 
  358. | 524288 SECRET SECTOR    | increments the %secret when entered
  359.     +-----------------------------------+
  360.     * FLAG 2 isn't used in the 14 original levels.
  361.     * FLAG 3 only serves as an extra lighting value in TALAY.
  362.  
  363.  
  364. 3.2-WALL FLAGS
  365.  
  366. * FLAG 1 +-----------------------------------+ 
  367. |            1 ADJOINING MID TX    | the MID TX is NOT removed
  368.     |            2 ILLUMINATED SIGN    |
  369.     |            4 FLIP TEXTURE HORIZONTALLY    |
  370.     |            8 ELEV CAN CHANGE WALL LIGHT  |
  371.     |        16 WALL TX ANCHORED    |
  372.     |        32 WALL MORPH WITH SECTOR    |
  373.     |        64 ALLOW SCROLL TOP  TX    |
  374.  
  375.     |   128 ALLOW SCROLL MID  TX    |
  376.     |   256 ALLOW SCROLL BOT  TX    |
  377.     |   512 ALLOW SCROLL SIGN TX    |
  378.     |  1024 HIDE ON MAP    |
  379.     |  2048 SHOW ON MAP    |
  380.     |  4096 SIGN ANCHORED    |
  381.     |  8192 WALL DAMAGES PLAYER    |
  382.     | 16384 SHOW AS LEDGE ON MAP    |
  383.     | 32768 SHOW AS DOOR  ON MAP    |
  384.     +-----------------------------------+
  385.     * FLAG 2 is unused.
  386. * FLAG 3 +-----------------------------------+ |        1 CAN ALWAYS WALK    |
  387.     |        2 CANNOT WALK THROUGH WALL    |
  388.     |        4 FENCE - KEEP ENNEMIES IN    |
  389.     |        8 CANNOT FIRE THROUGH WALL    |
  390.     +-----------------------------------+
  391.  
  392.  
  393. ***********
  394. 4-INF FILES
  395. ***********
  396. INF files are text files written in "the INF programming language". They accept C like  /* */  comments.
  397. They are linked to the SCs via the SC names, and
  398.                 to the WLs via the SC names and WL number.
  399. The basic items defined in the .INF are
  400.  - triggers  : * they trigger something in their 'clients'.
  401.  - elevators : * they receive messages and act upon them,
  402.  
  403. possibly sending other messages, and so on.
  404.         * they may also have 'slaves' following their every action.
  405. Elevators are to be taken very widely :
  406.     elevator basic
  407.     elevator change_light
  408.     elevator change_wall_light
  409.     elevator door
  410.     elevator door_mid
  411.     elevator inv
  412.     elevator morph_move1
  413.     elevator morph_move2
  414.     elevator morph_spin1
  415.     elevator morph_spin2
  416.     elevator move_ceiling
  417. elevator move_fc       (floor and ceiling together use @ stops !)
  418.     elevator move_floor
  419.     elevator rotate_wall
  420.     elevator scroll_ceiling
  421.     elevator scroll_floor
  422.     elevator scroll_wall
  423.     elevator teleporter chute [NEW]
  424. The variables in the language are the positions of the elevators created by the programmer (a lot of them in "dummy" (ie never accessible) sectors). Those positions are marked by 'stop:' keywords. The values following may be absolute or relative in which case they are prepended with a '@'. Note that the 'stop' unit is dependent of the elevator type. It may be floor altitude, ceiling altitude, ambient or light level, degrees ...
  425. The whole thing works by triggering/sending messages across the items and reacting to them differently depending on the "variables". Other actions can also be executed, such as adjoining, terminating, pausing and waking up (OB),
  426.  
  427. playing a sound, playing an animation, ...
  428. Here is a quick list of some of the messages :
  429.             [stop] [sector]
  430.             [stop] [sector[(wall)]] clear_bits    flagnum bitnum
  431.             [stop] [sector]    complete    num
  432.             [stop] [sector[(wall)]  done
  433.             [stop] [sector]    goto_stop    num
  434.             [stop] [sector]    master_on    [value]
  435.             [stop] [sector]    master_off    [value]
  436.             [stop] [sector[(wall)]] m_trigger    [value]
  437.             [stop] [sector]    next_stop
  438.             [stop] [sector]    prev_stop
  439.             [stop] [sector[(wall)]] set_bits    flagnum bitnum
  440.             [stop] [sector]    wakeup
  441.             [stop] system    lights            (in TALAY uses SC flag 3)
  442.             trigger              ??      (in FUELSTAT.INF line 391)
  443. The [stop] is the stop at which the message will be send. 
  444. So when you look at an INF file and you see something like :
  445.     class: elevator EEEEEE
  446.         stop: 0
  447.                 message: 0 MMMMMM
  448.         stop: 1
  449.                 message: 1 MMMMMM
  450. it's only a visual clue, and you could group all the messages in one place and in any order. Important : if you add a stop, you may have to renum !
  451. Note that the elevators START at their stop 0, but the messages are send when the elevators ARRIVE at a stop. So the messages set up at stop 0 won't be send at level startup.
  452.  
  453. And a list of the triggers :
  454.     trigger
  455.     trigger single
  456.     trigger switch1
  457.     trigger standard
  458.     trigger toggle
  459. The triggers react only to determinate events : this is called the event_mask. Some possible values follow :
  460.             1 WALK FROM INSIDE    ( line   trigger )
  461.             2 WALK FROM OUTSIDE    ( line   trigger )
  462.             4 ENTER SECTOR    ( sector trigger )
  463.             8 LEAVE SECTOR    ( sector trigger )
  464.         16 NUDGE FROM INSIDE    ( sector / line  )
  465.         32 NUDGE FROM OUTSIDE    ( sector / line  )
  466.         64 ??
  467.     128 ??
  468.     256 FIRE    ( line trigger with entity_mask: 8 )
  469.     512 ?? used once in ARC.INF
  470. If you want to use a 'fire on it' trigger, you have to change the entity_mask (ie what do you use to trigger) to 8.
  471. If you want to both fire and nudge for instance, use entity_mask: *
  472. The programming language is a little object oriented like, as you have default items in which you override only the fields you need. It is very powerful, and lets you to a certain extent dynamically modify the level.
  473. Here are some basic values (of course, not all elevators have them all!) : MASTER      (master item switch : may be on or off)
  474.     EVENT_MASK
  475.  
  476.     SPEED
  477.     CENTER
  478.     ANGLE
  479. As I don't have the time to compile a formal definition of the language, I give you the following advise : use a GREP like utility to generate a list of triggers, messages and elevators from all the .INF in the game, complete with filename and line numbers. This will make you a "reference" very useful to go and see how the LEC programmers do it.
  480. Note : don't forget to change the 'items' value when you modify an INF.
  481. To DOOM level makers : this may seem complicated, but I remember a WAD of mine with a long corridor with 19 consecutive linedefs doing modifications to the look of the level... then I remember spacing the linedefs so that some actions where finished before some others... then the player ran in the corridor...
  482. UNKNOWNS  : FORMAL FULL DESCRIPTION
  483.  
  484.  
  485. ***********
  486. 5-GOL FILES
  487. ***********
  488. GOL files contain a description of what to do to complete the levels.
  489. Sample code:
  490.     | GOL 1.0
  491.     | GOAL: 0       ITEM:   5       # DT weapon
  492.     | GOAL: 1       TRIG:   1
  493. Each GOAL: can be a TRIG: to fire or an ITEM: to take.
  494.  
  495. 'Goal triggers' are fired in the .INF file with the 'complete num' keyword sent to the complete sector (don't get confused here!).
  496. For instance,    " message: s complete complete 1 "
  497. will say that TRIG: 1 is complete!
  498. 'Goal objects' fire internal triggers because of their logic. That internal trigger seems to be equivalent to " message: s complete next_stop "
  499. So, be sure that complete is at a correct hold point when the object is taken. Try to do nothing else in complete than handling the goals.
  500. If necessary, start another 'level control' elevator very early.
  501. Object numbers are in an internal table at runtime.
  502. The broken Dark Trooper weapon for instance has the number 5 (see TALAY.GOL). If you want to make the player retrieve it in a SECBASE modification, just change the value of item to 5 in SECBASE.GOL (don't forget to put this object in your .O file).
  503. The message on the screen will be correct because the object has
  504. LOGIC: DT_WEAPON, and your OBJectives screen will be updated.
  505. But note that it still says 'retrieve death star plans'. Changing that means understanding the lfd format (which is most probably graphical !).
  506. Here are the screen messages associated with the goal objects, you can patch them in text.msg .
  507.     | 400  1:  "Death Star Plans"    for object 0
  508.     | 401  1:  "Phrik Metal"    for object 1
  509.     | 402  1:  "Nava Card"    for object 2
  510.     | 405  1:  "Dark Trooper Weapon"    for object 5
  511.     | 406  1:  "Data Tape"    for object 4
  512.  
  513. Object 6 is 'Your Gear' as used in the JABSHIP level and has the text
  514.     | 312  1:  "Your Gear"
  515. in the 'Power-Up Pickup Messages' section of the same text.msg file.
  516. Final note: don't assume the goals will happen in the .GOL order !
  517.  
  518.  
  519. *********
  520. 6-O FILES
  521. *********
  522. O files contain all the level objects.
  523. They are in a very understandable but a little complex text format. They accept C like  /* */  comments.
  524. 6.1. BASICS
  525.     ______
  526.     There are many different object types in Dark Forces:
  527. - SPIRIT : an object not linked to a viewable file (ie invisible) Its main use is for the PLAYER, but you can create other invisible items. [NEW]
  528.         - SAFE   : a restart point after the player died.
  529. You should put SAFEs in your levels, to allow the player to restart not far from where he died, but also because it seems to be the best bet as 'player starting points' if LEC produces a multiplayer version. (Put 8+ of them so you'll be ... safe!)
  530.         - SPRITE : fully animated objects such as ennemies.
  531.         - FRAME  : "one view" objects such as energy power ups.
  532.  
  533.         - 3D     : 3D objects such as mousebots.
  534.         - SOUND  : an ambient sound around the object position.
  535. 6.2. FILE DESCRIPTION
  536.     ________________
  537. The O file is composed of 4 parts : - magic and version number
  538.         - level name
  539.         - objects tables
  540.         - object descriptions
  541. 6.2.1. Magic and version number ------------------------
  542.             This is trivial.
  543.     | O 1.1
  544. 6.2.2. Level Name
  545.             ----------
  546.     | LEVELNAME SECBASE
  547.             I'm not sure this is used in DF !
  548. 6.2.3. Object tables
  549.             -------------
  550. As there is a lot of OB information in a level, 4 object tables are created to avoid storing OB names in full at each occurrence.
  551.  
  552.         Coding sample :
  553.     | PODS 3    # These are the "3D" objects
  554.     |  POD: DEATH.3DO    # 00
  555.     |        ...
  556.     |
  557.     | SPRS 10
  558.     |  SPR: OFFCFIN.WAX  # 00
  559.     |   ...
  560.     |
  561.     | FMES 6
  562.     |  FME: IENERGY.FME  # 00
  563.     |        ...
  564.     |
  565.     | SOUNDS 1
  566.     |  SOUND: BANG.VOC  #00
  567.     |        ...
  568. Afterwards, all the OBs are refered to by their 0 based index in the object tables. The object CLASS determines in which table to look.
  569. 6.2.4. Object descriptions
  570.         -------------------
  571. The first data is the total number of objects in the level :
  572.     | OBJECTS 185
  573.         Then each object is described.
  574. Please note that the object data first line has been splitted here for visual convenience.
  575.  
  576. |    CLASS: SPIRIT       DATA:  0 X:    131.00 Y:   0.00 Z: 210.00
  577.             PCH:    0.00 YAW: 176.34 ROL:   0.00
  578. DIFF: 1
  579. |     SEQ
  580. |      LOGIC:     PLAYER
  581. |      EYE:       TRUE
  582. |     SEQEND
  583. |
  584. |    CLASS: SPRITE       DATA:  0 X:    320.62 Y:  20.00 Z: 275.64
  585. \            PCH:    0.00 YAW: 270.00 ROL:   0.00
  586. \            DIFF: 1
  587. |     SEQ
  588. |      TYPE:      I_OFFICER
  589. |     SEQEND
  590. This is quite easy : CLASS is the type of object, and DATA is the offset in the corresponding object table (SPIRIT and SAFE have DATA = 0).
  591.     X, Y, Z are trivial.
  592. PCH, YAW, ROL are classic spatial orientation, but only YAW is really used (DOOM equivalent is THING orientation). It takes a value in degrees where 0 is at the "top of the screen when you look at the map". The value increases clockwise.
  593.     DIFF is the difficulty level at which the object appears.
  594.         +------+------------------+
  595.         | DIFF | EASY   MED  HARD |
  596.         +------+------------------+
  597.         |  -3  |   X     X     X  |
  598.         |  -2  |   X     X    |
  599.         |  -1  |   X    |
  600.  
  601.         |    0  |   X     X    X  |
  602.         |    1  |   X     X    X  |
  603.         |    2  |         X    X  |
  604.         |    3  |        X  |
  605.         +------+------------------+
  606. SEQ and SEQEND are delimiters for a series of options/modifiers to apply
  607.     to the object. They determine part of its behaviour ( LOGIC: ).
  608. For instance, if you take a mousebot and set it the LOGIC:  of a stormtrooper, you'll end up with an unmoving lifeless mousebot.
  609.     [NEW]
  610. It seems that the keywords TYPE: and LOGIC: are freely swappable, as are UPDATE and ANIM, and that the ITEM keyword is optional, but this has to be tested fully.
  611. Note that the same viewable file may be used to create 'different' objects. For instance, OFFCFIN.WAX may be used with a TYPE: I_OFFICER or TYPE: I_OFFICERR (note the second 'R') which will generate a red key when killed.
  612.     The other use of this is to create object generators.
  613.     Here is a quite self explaining sample:
  614. |    CLASS: SPRITE       DATA:  4 X: 396.88 Y:  -2.00 Z: 217.48
  615. \                                PCH:   0.00 YAW:   0.00 ROL:   0.00 DIFF: 1
  616. |     SEQ
  617. |            LOGIC:    GENERATOR STORM1
  618. |            DELAY:    0
  619. |            INTERVAL:  20
  620. |            MAX_ALIVE: 1
  621. |            MAX_DIST:  200
  622. |            MIN_DIST:  70
  623.  
  624.     |   NUM_TERMINATE: 3
  625.     |  SEQEND
  626. What is not clear is WHEN they are generated. What I know is that they are never generated while you look directly at the generator !
  627. Also note that you can set MASTER: OFF on a generator, and activate it by sending a message: s master_on to the sector that contains it. [NEW]
  628. [NEW] I set as unknown the workings of the KYL3DO object in the previous specs, but it works perfectly well. You just have to use the same coordinates as they are hardcoded !
  629. UNKNOWNS: FORMAL FULL DESCRIPTION
  630.             exact generator workings
  631.  
  632.  
  633. ***********
  634. 7-PAL FILES
  635. ***********
  636. PAL files store a single 256 colors palette as 256 x 3 RGB bytes. Each level can have its own palette.
  637. UNKNOWNS: NONE
  638.  
  639.  
  640. ***********
  641. 8-CMP FILES
  642. ***********
  643. CMP file seem to store palette mappings (like DOOM COLORMAP). They contain 32 times 256 bytes for light levels 0 to 31.
  644.  
  645. Note that colors from 0 to 31 are never modified. Keep this in mind if you design textures. They can follow the lights or not at your own convenience.
  646. There are 128 other unknown bytes at the end of the file forming a slow gradient from 0x00 to 0x1F. I don't know what they are for.
  647.  
  648.  
  649. ***********
  650. 9-BM  FILES
  651. ***********
  652. Here is the C structure for the BM file header.
  653. struct BM_header
  654. {
  655.  char    MAGIC[4];
  656. int       SizeX;           /* if X = 1 then multiple BM in the file */
  657.  int    SizeY;           
  658.  int    idemX;
  659.  int    idemY;
  660.  byte    transparent;    /* 0x36 for normal, 0x3E for transparent */
  661.  byte    logSizeY;    /* ie logSizeY = log2(SizeY)             */
  662.  int    Compressed;    /* 0 = not compressed, 1 = compressed    */
  663.  long    DataSize;    /* excluding header                      */
  664.  char    filler[12];
  665. };
  666. Please note that BMs must have a height which is a power of 2.
  667. The data follows, encoded by COLUMNS from the bottom to the top.
  668. Transparent BMs :
  669. ---------------
  670.  
  671. You can transform any BM in a 'transparent' BM by changing its transparent value from 0x36 to 0x3E. The color 0 will 'disappear'.
  672. Note that this isn't the same color as the one used in DOOM transparent textures (cyan in the DOOM palette).
  673. Multiple BMs    :
  674. ------------
  675. If SizeX == 1 BM file contains idemY BMs.
  676. There follow two bytes, the first of which permits to distinguish between 'switches' (if == 0) and 'animated textures'. It is the speed of animation (maybe in frames per second). You may alter this value if you want to. The second is 2.
  677. Then follows a table of offsets to the 'sub' BMs composed of idemY BMs. 
  678. Each 'sub' BM then has its own header WITHOUT the MAGIC field (ie 28 bytes), with some slight modifications (I'll check later!).
  679. Important note: for a multiple BM to work correctly, it must be made a 'SIGN', AND for switches there MUST also exist a corresponding trigger in the .INF Else, switches will be displayed wrong (as a single column) and the animated will display correctly, but static. This means that you cannot do animated floors and ceilings this way!
  680. Compressed BMs  :
  681. --------------
  682. If compressed == 1  BM is compressed.
  683. These existed in the DEMO (buyit.bm), but I'm not sure if there are any in the full game. They use a mixed direct/RLE coding. In the demo, wait.bm also used yet another coding, but it's a perfectly normal BM in the full game.
  684.  
  685. Here we go. Fasten seat belts!
  686. The heart of the data is a 'columns starts' table, with the start addresses of each of the columns. It is at the end of the file, at offset DataSize,
  687. and has one long entry per column containing this column start address. This start address is calculated without the 32 bytes BM header
  688. (ie read the header in a struct, then the data in a HUGE buffer at offset 0).
  689. The coding of one column follows (in a pseudo pseudocode format!).
  690.  while(end of data for this column not reached)
  691.  {
  692.     if(buffer[adr] <= 128)
  693.         the FOLLOWING n bytes are direct values
  694.     else
  695.         the FOLLOWING byte is a color byte to repeat n-128 times
  696.  }
  697. There was an 0xFF last byte marker per column. However,I do prefer to calculate the end of the column data by using the start of next column, as this is more like the FME and WAX reading technique.
  698. A    slight variation of this compression is used in the frames and the sprites.
  699. You may unfasten your seat belts!
  700.  
  701.  
  702. ************
  703. 10-FME FILES
  704. ************
  705. Contains the frames, which are the "one view" objects (you can turn around them, and always see the same image).
  706.  
  707. Here are the C structures for the FME file headers.
  708. struct FME_header1
  709. {
  710.  long  u1;
  711.  long  u2;
  712.  long  u3;
  713.  long  header2;         /* this is the absolute adress of header2 */
  714.  char  unknown[16];
  715. }
  716. struct FME_header2
  717. {
  718.  int    SizeX;
  719.  int    u1;
  720.  int    SizeY;
  721.  int    u2;
  722.  int    Compressed;
  723.  int    u3;
  724.  long  DataSize;
  725.  char  fil[8];
  726. };
  727. There are at least two formats for these.
  728. If Compressed == 0 the format it very similar to the BM format, with just the header rearranged.
  729. The header 1 is totaly unknown except for the field header2.
  730. The header 2 contains the X and Y sizes, and the data follows, encoded
  731. by COLUMNS from the bottom to the top.
  732. With Compressed == 1, the format looks like the compressed BM used in the demo level, also with the header modifications (see).
  733.  
  734. Four differences :
  735. * the 'column starts' table is at the top of the file, just after the header.
  736.  * you have to offset the adresses by -24 (they counted only header 1 ?)
  737.  * the end of column data marker isn't there.
  738.  * the backgroud color is always 0 (transparent) and ISN'T CODED.
  739.     (there was a color byte in the BM compressed format).
  740. There are two negative longs right at the beginning of header 1 that I don't understand.
  741. UNKNOWNS  : what's in FME_header1
  742.  
  743.  
  744. ************
  745. 11-WAX FILES
  746. ************
  747. Contains the sprites.
  748. (samples : STORMTROOPERS, BONUS LIVES ...)
  749. These are a collection of embedded FME files. They contain a table with
  750. 32 entries (offset to first entry = 0x000000BC). Each of these entry points to a table containing adresses of a complete embedded enhanced FME file.
  751. Take care to read that one properly (ie using the header2 offset in header1) as there are multiple consecutive header1 !
  752. As I began to wrote a viewer for these, I tried all the 32 first table entries for a few waxes. Though they followed a different path through the pointers in the file, I always get the same image ??? I'll try to find more later.
  753. UNKNOWNS  : exact FILE FORMAT and details
  754.  
  755.  
  756. ************
  757. 12-3DO FILES
  758. ************
  759. Contains the "3D" objects.
  760. (samples : MOUSEBOT, the DEATH STAR HOLOGRAM, ...)
  761. These are text files containing a geometric description of a full 3D object. I really don't have time now, but it should be quite easy to understand.
  762. UNKNOWNS  : everything!
  763.  
  764.  
  765. ************
  766. 13-VOC FILES
  767. ************
  768. Contains the sounds.
  769. These are standard .VOC files in the Creative Labs format.
  770.  
  771.  
  772. ************
  773. 14-GMD FILES
  774.    [NEW]
  775. ************
  776. Contains the musics. 
  777. The GMD files are SMF files type 2 (SMF = Standard Midi Files), but they've got a different header. If you want to convert the header, you'll have to delete everything BEFORE the string "MThd", so that the file begins with that string. After you've done that, you can play/edit the file with any type 2 compatible MIDI sequencer program.
  778.  
  779.  
  780. ************
  781. 15-MSG FILES
  782. ************
  783. Contains the text messages used in the game.
  784. local.msg contains error messages and should be left untouched.
  785. text.msg  however can be patched. The use of this is to create new messages that you can use in your levels (create a trigger, use text: ttt).
  786. General format:
  787.     | MSG 1.0
  788.     |
  789.     | MSGS 119
  790.     |
  791.     | # internal game messages
  792.     | 0    0:  "Joystick Off"
  793.     | ...
  794.     | END
  795. MSGS is the number of messages. Don't forget to update it if you add messages.
  796. I found no problems by adding messages at 900 and more.
  797.     | 900  1:  "Hurry up !"
  798. I don't know what the second number ( ie 0: ) is for. I use 1:
  799. Here are also the 'cheat messages' from 700 onwards. Just so you know where to insert a few 'Cheater!' and 'Chicken Mode ON' ...
  800.  
  801.  
  802. **************
  803. 16-CHEAT CODES
  804. **************
  805. Just in case you haven't found them anywhere else ! I've also shown the equivalent cheat for DOOMers.
  806. LABUG    bug mode
  807. LACDS    map with things    (IDDT x2)
  808. LADATA    coordinates & %secret    (IDMYPOS)
  809. LAIMLAME    total invincibility    (IDDQD)
  810. LANTFH    teleport to a safe
  811. LAPOGO    allow to climb any height    (IDSPISPOPD / IDCLIP w/o walking thru)
  812. LAPOSTAL    get weapons and ammo    (IDFA)
  813. LARANDY    weapon super charge
  814. LAREDLITE  freeze ennemies
  815. LASKIP    finishes current level
  816. LAUNLOCK    get all the keys    (the 'K' of IDKFA)
  817. LAlevel    jump to level    (IDCLEV)
  818.